
#include "stdio.h"
#include <unistd.h>
#include "fcntl.h"
#include "error.h"
#include "stdlib.h"
#include "hx711.h"

char str[64];
void linux_gpio_init(int gpio_io){
    int fd=0;
    fd=open("/sys/class/gpio/export",O_RDWR);
    if(fd < 0) {perror("gpio init failed:"); exit(0);}
    sprintf(str,"%d",gpio_io);
    write(fd,str,1);
    close(fd);
}
 
void gpio_direction_output(int gpio_io){
    int fd=0;
    sprintf(str,"/sys/class/gpio/gpio%d/direction",gpio_io);
    fd=open(str,O_RDWR);
    if(fd < 0) {perror("gpio dir open failed:"); exit(0);}
    write(fd,"out",3);
    close(fd);
}

 
void gpio_direction_input(int gpio_io){
    int fd=0;
    sprintf(str,"/sys/class/gpio/gpio%d/direction",gpio_io);
    fd=open(str,O_RDWR);
    if(fd < 0) {perror("gpio dir open failed:"); exit(0);}
    write(fd,"in",2);
    close(fd);
}


void gpio_set_value(int gpio_io,int level){
    int fd=0;
    sprintf(str,"/sys/class/gpio/gpio%d/value",gpio_io);
    fd=open(str,O_RDWR);
    if(fd < 0) {perror("gpio open value failed:"); exit(0);}
    if(level==1) write(fd,"1",1);
    else write(fd,"0",1);
    close(fd);
}


unsigned char  gpio_get_value(int gpio_io){
    int fd;
    char value_set[1];
    sprintf(str,"/sys/class/gpio/gpio%d/value",gpio_io);
    fd=open(str,O_RDWR);
    if(fd < 0) perror("gpio open value failed:");
    read(fd,value_set,1);
    close(fd);
    if((unsigned char)value_set[0] ==48) return 0;
    return 1;
}
 
 
void hx711_init(void){
//    linux_gpio_init(GPIO_SCK);
//    linux_gpio_init(GPIO_DT);
    gpio_direction_output(GPIO_SCK);//设置为输出方向并输出1
    gpio_direction_input(GPIO_DT); 
    printf("hx711 init all sucess\n");
    sleep(1);
}

/* 读取传感器返回的ADC数据值（数字量） 假定为一阶线性关系 y=kx+b */
float hx711_readCount(void)
{
    unsigned long count = 0;		/* 需要读取25-27个0/1数据 */
    gpio_set_value(GPIO_DT,1);
    gpio_set_value(GPIO_SCK, 1);
    gpio_set_value(GPIO_SCK, 0);
	/* 添加超时检测 防止一直未识别到传感器导致程序卡死在这里 */
    while(gpio_get_value(GPIO_DT)){
        //printf("%d\n",gpio_get_value(GPIO_DT));
    }
    /* 读取24位的ADC数字量数据 */
    for(unsigned char i=0; i<24; i++) {
        gpio_set_value(GPIO_SCK, 1);
        gpio_set_value(GPIO_SCK, 0);
        count |= (gpio_get_value(GPIO_DT)) << (24-i); /* 上升沿读取数据 */
    }
    return (((float)(count ^ 0x800000))-8674523)/800977*500;
}



